/*
    server.c
    服务器
*/

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/un.h>
#include <netinet/in.h>

#define NAME "tsever"

int main()
{
    // 删除
    unlink(NAME);
    // 1. 创建套接字
    // 参数 协议（域）   套接字类型  协议 0为默认协议
    int fd = socket(AF_UNIX, SOCK_STREAM, 0);

    // 创建一个地址
    struct sockaddr_un addr;
    addr.sun_family = AF_UNIX;
    strcpy(addr.sun_path, NAME);

    // 网络通信
    // struct sockaddr_in addr2;
    // addr2.sin_family = AF_INET;
    // addr2.sin_port = 8000;

    // 2. 绑定
    bind(fd, (struct sockaddr*)&addr, sizeof(addr));
    
    // 3. 创建用于三次握手的队列，并指定队列的大小
    listen(fd, 9);
    printf("服务器启动\n");

    while(1)
    {
        // 对应客户端的文件描述符
        int c_fd;
        // 传出参数，接受客户端的地址信息
        struct sockaddr_un c_addr;
        int size = sizeof(c_addr);
        // 接收连接,如果队列中没有请求会阻塞
        c_fd = accept(fd, (struct sockaddr*)&c_addr, &size);
        // 多线程
        // 读写
        char buf[128];
        memset(buf, 0, sizeof(buf));
        read(c_fd, buf, 128);
        printf("收到了：%s\n", buf);

        char *msg = "bye";
        write(c_fd, msg, strlen(msg)+1);
        // 关闭客户端对应的文件描述符
        close(c_fd);
    }
    return 0;
}